package com.mall.common.utils;

import java.util.concurrent.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 线程相关工具类
 * Created by zhonglin on 2020/4/8.
 */
public class Threads {

  private static final Logger logger = LoggerFactory.getLogger(Threads.class);

  /**
   * sleep等待,单位为毫秒
   */
  public static void sleep(long milliseconds) {

    try {
      Thread.sleep(milliseconds);
    } catch (InterruptedException e) {
      return;
    }
  }

  /**
   * 停止线程池
   * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
   * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
   * 如果仍人超時，則強制退出.
   * 另对在shutdown时线程本身被调用中断做了处理.
   */
  public static void shutdownAndAwaitTermination(ExecutorService pool) {

    if (pool != null && !pool.isShutdown()) {
      pool.shutdown();
      try {
        if (!pool.awaitTermination(120, TimeUnit.SECONDS)) {
          pool.shutdownNow();
          if (!pool.awaitTermination(120, TimeUnit.SECONDS)) {
            logger.info("Pool did not terminate");
          }
        }
      } catch (InterruptedException ie) {
        pool.shutdownNow();
        Thread.currentThread()
              .interrupt();
      }
    }
  }

  /**
   * 打印线程异常信息
   */
  public static void printException(Runnable r,
                                    Throwable t) {

    if (t == null && r instanceof Future<?>) {
      try {
        Future<?> future = (Future<?>) r;
        if (future.isDone()) {
          future.get();
        }
      } catch (CancellationException ce) {
        t = ce;
      } catch (ExecutionException ee) {
        t = ee.getCause();
      } catch (InterruptedException ie) {
        Thread.currentThread()
              .interrupt();
      }
    }
    if (t != null) {
      logger.error(t.getMessage(), t);
    }
  }

}
